<?php
// 读取JSON配置文件
$configContent = file_get_contents(__DIR__ . '/admin/config.json');
$config = json_decode($configContent, true);

// 确保没有输出被发送
ob_start();

// 设置内容类型
header('Content-Type: text/plain; charset=utf-8');

// 检查图像处理扩展
$hasGD = extension_loaded('gd');
$hasImageProcessing = $hasGD;

// 检查维护模式
if (!empty($config['maintenanceMode']) && $config['maintenanceMode']) {
    header('HTTP/1.1 503 Service Unavailable');
    header('X-Blocked-Reason: Maintenance Mode');
    die('系统维护中，请稍后再试');
}

// 检查访问限制功能是否启用
if (!empty($config['rateLimitEnabled']) && $config['rateLimitEnabled']) {

// 获取访问者IP地址
$clientIP = $_SERVER['REMOTE_ADDR'];
if (empty($clientIP)) {
    header('HTTP/1.1 400 Bad Request');
    die('Invalid IP address');
}

// 检查黑名单
$blacklist = file_exists(__DIR__ . '/admin/blacklist.txt') ? file(__DIR__ . '/admin/blacklist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];
if (!empty($blacklist) && in_array($clientIP, $blacklist)) {
    header('HTTP/1.1 403 Forbidden');
    header('X-Blocked-Reason: IP Blacklisted');
    die('Access denied: Your IP is blacklisted');
}

// 检查白名单
$whitelist = file_exists(__DIR__ . '/admin/whitelist.txt') ? file(__DIR__ . '/admin/whitelist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];
if (!empty($whitelist) && !in_array($clientIP, $whitelist)) {
    header('HTTP/1.1 403 Forbidden');
    header('X-Blocked-Reason: IP Not Whitelisted');
    die('Access denied: Your IP is not in whitelist');
}

// 检查防盗链
$allowedDomains = isset($config['allowedDomains']) ? $config['allowedDomains'] : [];
if (!empty($config['hotlinkProtection']) && $config['hotlinkProtection'] && !empty($allowedDomains)) {
    $referer = isset($_SERVER['HTTP_REFERER']) ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) : null;
    if ($referer && !in_array($referer, $allowedDomains)) {
        header('HTTP/1.1 403 Forbidden');
        header('X-Blocked-Reason: Hotlinking Not Allowed');
        die('Access denied: Hotlinking from this domain is not allowed');
    }
}

}

// 检查访问频率限制
$rateLimitFile = __DIR__ . '/admin/rate_limit.txt';

// 获取白名单IP列表
$whitelist = file_exists(__DIR__ . '/admin/whitelist.txt') ? file(__DIR__ . '/admin/whitelist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];

// 如果IP在白名单中，则跳过频率限制检查
if (!empty($whitelist) && in_array($clientIP, $whitelist)) {
    // 白名单IP不受频率限制
} else {
    // 记录访问频率
    $now = time();
    $rateData = [];
    if (file_exists($rateLimitFile)) {
        $rateData = file($rateLimitFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    }

    // 清理过期的访问记录
    $rateData = array_filter($rateData, function($entry) use ($now) {
        list($ip, $timestamp) = explode('|', $entry);
        return $now - $timestamp <= 60; // 只保留60秒内的记录
    });

    // 统计当前IP的访问次数
    $currentIPCount = 0;
    foreach ($rateData as $entry) {
        list($ip, $timestamp) = explode('|', $entry);
        if ($ip === $clientIP) {
            $currentIPCount++;
        }
    }

    // 添加当前访问记录
    $rateData[] = $clientIP . '|' . $now;
    file_put_contents($rateLimitFile, implode("\n", $rateData));

    // 检查是否超过限制
    $rateLimitThreshold = isset($config['rateLimitThreshold']) ? $config['rateLimitThreshold'] : 60;
    if ($currentIPCount >= $rateLimitThreshold) {
        // 添加到永久黑名单
        $blacklist = file_exists(__DIR__ . '/admin/blacklist.txt') ? 
            file(__DIR__ . '/admin/blacklist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];
        if (!in_array($clientIP, $blacklist)) {
            $blacklist[] = $clientIP;
            file_put_contents(__DIR__ . '/admin/blacklist.txt', implode("\n", $blacklist));
        }
        
        header('HTTP/1.1 429 Too Many Requests');
        header('X-Blocked-Reason: Rate Limit Exceeded');
        die('Access denied: Your IP has been permanently blocked due to excessive requests');
    }
}

// 根据模式选择处理方式
$redirectMode = isset($config['redirectMode']) ? $config['redirectMode'] : 1;
if ($redirectMode == 1) {
    // 模式1：从目录读取图片
    $imageDir = __DIR__ . '/images/pe/';
    if (!is_dir($imageDir)) {
        header('HTTP/1.1 500 Internal Server Error');
        die('Images directory not found');
    }
} else {
    // 模式2：从链接文件读取
    $linksFile = __DIR__ . '/pe.txt';
    if (!file_exists($linksFile)) {
        // 链接文件路径配置
        header('HTTP/1.1 500 Internal Server Error');
        die('Links file not found');
    }
    $links = file($linksFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (empty($links)) {
        header('HTTP/1.1 500 Internal Server Error');
        die('No valid links found in links.txt');
    }
    $randomLink = $links[array_rand($links)];
    header('Location: ' . $randomLink);
    exit;
}

// 检测浏览器支持的图片格式
$acceptHeader = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '';

// 定义支持的图片格式及其优先级
$supportedFormats = [];

if (!empty($config['smartFormatSelection']) && $config['smartFormatSelection']) {
    // 智能格式选择模式
    // 检查是否支持WebP
    if (strpos($acceptHeader, 'image/webp') !== false) {
        $supportedFormats[] = 'webp';
    }
    
    // 添加通用支持的格式
    $supportedFormats[] = 'jpg';
    $supportedFormats[] = 'jpeg';
    $supportedFormats[] = 'png';
    
    // 如果没有检测到任何支持的格式，默认使用所有格式
    if (empty($supportedFormats)) {
        $supportedFormats = ['webp', 'jpg', 'jpeg', 'png', 'gif'];
    }
} else {
    // 非智能模式，使用所有格式
    $supportedFormats = ['webp', 'jpg', 'jpeg', 'png', 'gif'];
}

// 按照优先级查找图片
$allImages = [];
$requestedFormatImages = [];

// 首先查找请求的格式
foreach ($supportedFormats as $format) {
    $formatImages = glob($imageDir . '*.' . $format);
    if (!empty($formatImages)) {
        if (empty($requestedFormatImages)) {
            $requestedFormatImages = $formatImages;
        }
        $allImages = array_merge($allImages, $formatImages);
    }
}

// 如果没有找到任何图片，尝试查找所有支持的格式
if (empty($allImages)) {
    $allImages = array_merge(
        glob($imageDir . '*.webp'),
        glob($imageDir . '*.jpg'),
        glob($imageDir . '*.jpeg'),
        glob($imageDir . '*.png'),
        glob($imageDir . '*.gif')
    );
}

// 如果没有找到请求格式的图片，但找到了其他格式的图片，并且服务器支持图像处理
if (empty($requestedFormatImages) && !empty($allImages) && $hasImageProcessing && !empty($supportedFormats)) {
    // 获取所有可用的源图片
    $sourceImages = array_merge(
        glob($imageDir . '*.jpg'),
        glob($imageDir . '*.jpeg'),
        glob($imageDir . '*.png'),
        glob($imageDir . '*.webp'),
        glob($imageDir . '*.gif')
    );
    
    if (!empty($sourceImages)) {
        // 随机选择一个源图片
        $sourceImage = $sourceImages[array_rand($sourceImages)];
        $sourceExt = pathinfo($sourceImage, PATHINFO_EXTENSION);
        $baseName = pathinfo($sourceImage, PATHINFO_FILENAME);
        
        // 尝试转换为请求的第一个格式
        $targetFormat = $supportedFormats[0];
        $targetPath = $imageDir . $baseName . '.' . $targetFormat;
        
        // 如果目标文件不存在，尝试转换
        if (!file_exists($targetPath)) {
            $converted = false;
            
            // 使用GD库转换
            if ($hasGD) {
                $converted = convertImageWithGD($sourceImage, $targetPath, $sourceExt, $targetFormat);
            }
            
            // 如果转换成功，使用新生成的图片
            if ($converted) {
                $requestedFormatImages[] = $targetPath;
                $allImages[] = $targetPath;
            }
        }
    }
}

// 检查是否找到图片
if (empty($allImages)) {
    header('HTTP/1.1 404 Not Found');
    die('No images found in the directory');
}

// 优先使用请求格式的图片，如果有的话
$imagesToUse = !empty($requestedFormatImages) ? $requestedFormatImages : $allImages;

// 随机选择一张图片
$randomImage = $imagesToUse[array_rand($imagesToUse)];
if (!file_exists($randomImage)) {
    header('HTTP/1.1 404 Not Found');
    die('Selected image not found');
}

// 获取图片的相对路径
$relativePath = str_replace(__DIR__, '', $randomImage);

// 清除任何输出缓冲
ob_end_clean();

// 重定向到随机图片
header('Location: ' . $relativePath);
exit;

/**
 * 使用GD库转换图像
 * 
 * @param string $sourcePath 源图像路径
 * @param string $targetPath 目标图像路径
 * @param string $sourceExt 源图像扩展名
 * @param string $targetExt 目标图像扩展名
 * @return bool 转换是否成功
 */
function convertImageWithGD($sourcePath, $targetPath, $sourceExt, $targetExt) {
    // 加载源图像
    $sourceImage = null;
    switch (strtolower($sourceExt)) {
        case 'jpg':
        case 'jpeg':
            $sourceImage = @imagecreatefromjpeg($sourcePath);
            break;
        case 'png':
            $sourceImage = @imagecreatefrompng($sourcePath);
            break;
        case 'webp':
            if (function_exists('imagecreatefromwebp')) {
                $sourceImage = @imagecreatefromwebp($sourcePath);
            }
            break;
    }
    
    if (!$sourceImage) {
        return false;
    }
    
    // 保存为目标格式
    $result = false;
    switch (strtolower($targetExt)) {
        case 'jpg':
        case 'jpeg':
            $result = @imagejpeg($sourceImage, $targetPath, 90);
            break;
        case 'png':
            $result = @imagepng($sourceImage, $targetPath, 9);
            break;
        case 'webp':
            if (function_exists('imagewebp')) {
                $result = @imagewebp($sourceImage, $targetPath, 80);
            }
            break;
    }
    
    // 释放资源
    imagedestroy($sourceImage);
    
    return $result;
}